/*********************************************************************************************************
 *───────────────────────────────────────────────── 引入 ─────────────────────────────────────────────────
 *********************************************************************************************************/
import {
  app,
  ipcMain,
  protocol,
  BrowserWindow,
  globalShortcut,
  Menu,
  Tray,
  dialog
} from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import { createTopMenu }  from './assets/js/topMenu.js'

/*********************************************************************************************************
 *───────────────────────────────────────────────── 参数 ─────────────────────────────────────────────────
 *********************************************************************************************************/
const isDev  = process.env.NODE_ENV !== 'production'
const cp     = require("child_process")
const path   = require('path')

/*********************************************************************************************************
 *───────────────────────────────────────────────── 对象 ─────────────────────────────────────────────────
 *********************************************************************************************************/
// 窗口
let win,tary
// 此方法只能在 app 的 ready 事件触发前调用,且只能调用一次
protocol.registerSchemesAsPrivileged([{scheme: 'app', privileges: { secure: true, standard: true } }])

/**
 * 当全部窗口关闭时退出
 */
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {// 在 macOS 上,除非用户用 Cmd + Q 确定地退出,否则绝大部分应用及其菜单栏会保持激活.
    app.quit()
  }
})

app.on('activate', () => {
  if (win === null) {// 在macOS上,当单击dock图标并且没有其他窗口打开时,通常在应用程序中重新创建一个窗口.
    createWindow()
  }
})

/**
 * Electron 会在初始化后并准备创建浏览器窗口时,调用这个函数,部分 API 在 ready 事件触发后才能使用.
 */
app.on('ready', async () => {
  if (isDev && !process.env.IS_TEST) {
      null
  }
  console.log('======> 当前环境 ['+process.env.WEBPACK_DEV_SERVER_URL+']')
  console.log('======> 项目路径 [' + __dirname + ']')
  registerShortcut() //    注册快捷键
  createWindow()     // 1. 系统窗口
  createTopMenu()    // 2. 头部菜单
  createTray(win)    // 3. 系统托盘
})

/**───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ** 快局快捷键
 **───────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
function registerShortcut() {
  globalShortcut.register('Ctrl+Alt+Q', () => {
    win.webContents.send("remote-screenshot")
  })

  globalShortcut.register('Alt+V', () => {
    win.webContents.send("remote-BossShield")
  })
}
/**───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ** 系统窗口
 **───────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
function createWindow () {
  // 创建浏览器窗口
  win = new BrowserWindow({
    icon: './public/static/icon/plant_1_256.ico',
    width: 1150,
    height: 700,
    minWidth: 1150,
    minHeight: 700,
    frame: false,    // 无边框窗口
    // transparent: true,  // 无框窗口透明
    hasShadow: true,
    webPreferences: {
      nodeIntegration: true
    }
  })

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // 如果处于开发模式，则加载dev服务器的url
    win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) {
      win.webContents.openDevTools() // 打开开发者工具
    }
  } else {
    createProtocol('app')
    // Load the index.html when not in development
    win.loadURL('app://./index.html')
  }

  /**
   * 窗口关闭
   * 取消引用 window 对象,如果你的应用支持多窗口的话,通常会把多个 window 对象存放在一个数组里面,与此同时,你应该删除相应的元素.
   */
  win.on('closed', () => {
    win = null
  })
}


/**───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ** 系统托盘
 **───────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
export const createTray = () => {
  const menu = [
    {
      label: '打开',
      click: function () {win.show()}
    },{
      label: '退出',
      click: function () {app.quit()}
    }
  ]

  let trayIcon;// './public/static/plant_1_16.ico'
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    trayIcon = path.join(__static,'/static/icon/plant_1_16.ico')
  } else {
    trayIcon = path.join(path.dirname(app.getAppPath()),'./icon/plant_1_16.ico')
  }

  const trayMenu = Menu.buildFromTemplate(menu);
  tary = new Tray(trayIcon)
  tary.setToolTip(
    "林地奥秘\n" +
    "截图 : Ctrl+Alt+Q"
  )
  tary.setContextMenu(trayMenu)

  tary.on('click',function (event){
    win.show()
  })
}


ipcMain.on('test-dialog',() => {
  dialog.showMessageBox({
    type: 'info',
    title: 'forest secret test',
    message: app.getAppPath(),
    buttons:['ok','no']
  })

})


/**───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ** 新窗口
 **───────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
/**
 * 新窗口set集合
 * @type {Set<any>}
 */
const newWins = new Set()
ipcMain.on('newWin', (event,arg) => {
  // 创建浏览器窗口
  let newWin = new BrowserWindow({
    icon: './public/static/icon/plant_1_256.ico',
    width: 1150,
    height: 700,
    minWidth: 1150,
    minHeight: 700,
    frame: true,    // 无边框窗口
    // transparent: true,  // 无框窗口透明
    hasShadow: true,
    webPreferences: {
      nodeIntegration: true
    }
  })

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // 如果处于开发模式，则加载dev服务器的url
    newWin.loadURL(process.env.WEBPACK_DEV_SERVER_URL+'#/indexArtView/' + arg)
    if (!process.env.IS_TEST) {
      // newWinItem.webContents.openDevTools() // 打开开发者工具
    }
  } else {
    newWin.loadURL('app://./index.html' + '#/indexArtView/' + arg)
  }

  newWin.on('closed', () => {
    newWins.delete(newWin)
    newWin = null
  })

  newWins.add(newWin); //将窗口添加到已打开时设置的窗口
})

/**───────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ** 主进程方法
 **───────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
/**
 * 开发者工具打开
 */
ipcMain.on('console-show', () => {
  if (win.webContents.isDevToolsOpened()) {
    win.webContents.closeDevTools()
  } else {
    win.webContents.openDevTools()
  }
})

/**
 * 窗口隐藏
 */
ipcMain.on('window-hide',() => {
  win.hide();
})

/**
 * 窗口隐藏
 */
ipcMain.on('window-show',() => {
  win.show();
})

/**
 * 窗口最小化
 */
ipcMain.on('window-min',() => {
  win.minimize()
  // win.hide();
})

/**
 * 窗口最大化
 */
ipcMain.on('window-max',() => {
  if(win.isMaximized()) {
    win.restore()
  }else{
    win.maximize()
  }
})

/**
 * 窗口关闭
 */
ipcMain.on('window-close',() => {
  win.close();
})

/**
 * 截图功能
 */
ipcMain.on('window-capture',(event,arg) => {
  let filePath = path.join(__dirname,'../extraResources/screenshot/PrintScr.exe')
  win.hide()
  setTimeout(()=>{
    var screen_window = cp.execFile(filePath)
    screen_window.on('exit', function (code) {
      // 执行成功返回 1，返回 0 没有截图
      if (code) {
        event.reply('capture-callback')
      }
      win.show()
    })
  },300)
})



if (isDev) {
  if (process.platform === 'win32') {
    process.on('message', data => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}





















